﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Threading;

namespace SocketClient
{
    /// <summary>
    /// Interaction logic for JanelaPartida.xaml
    /// </summary>
    public partial class JanelaPartida : Window
    {
        private String sala = "";
        private String dono = "";

        List<String> jogadores = new List<String>();
        List<String> nomesPts = new List<String>();

        private Thread threadPartida;
        private Boolean threadRunningPartida;
        private Conexao conexao;
        private string jogadordavez;
        private string jogador;
        private string tentativa = "3";
        private string checkeds;
        private string ResultadoAberto;
        private string JogadorEnviouMsg;
        private string JogadorVazando;
        private string MsgChatEnviada = "";

        public JanelaPartida(Conexao con, String dono, String nomeSala)
        {
            this.conexao = con;
            this.dono = dono;
            sala = nomeSala;
            ResultadoAberto = "naoabrirresultado";

            nomesPts.Add("Um");
            nomesPts.Add("Dois");
            nomesPts.Add("Três");
            nomesPts.Add("Quatro");
            nomesPts.Add("Cinco");
            nomesPts.Add("Seis");
            nomesPts.Add("FullHouse");
            nomesPts.Add("Quadra");
            nomesPts.Add("Sequência");
            nomesPts.Add("General");
            nomesPts.Add("Total");

            InitializeComponent();

            ChecksDisable();
            ChecksTrue();
            ButtonsDisable();

            Title = conexao.NomeJogador;

            conexao.Send("jogadoresdapartida/" + sala);
            String message = conexao.Receive();
            String[] tokens = message.Split('|');
            jogadordavez = tokens[0];
            jogador = tokens[1];
            if (jogadordavez == jogador)
            {
                ButtonsEnable();
            }

            for (int i = 2; i < tokens.Count(); i++)
            {
                jogadores.Add(tokens[i]);
            }
            TextBlock nada = new TextBlock();

            nada.Text = "";
            nada.Height = 23;
            nada.HorizontalAlignment = HorizontalAlignment.Center;
            nada.VerticalAlignment = VerticalAlignment.Center;
            nada.Margin = new Thickness(10, 6, 10, 0);
            Grid.SetColumn(nada, 0);
            Grid.SetRow(nada, 0);
            grid1.Children.Add(nada);

            PreencheRetangulos();
            PreencheJogadores();
            PreencheNomesPts();
            for (int i = 1; i <= nomesPts.Count; i++)
            {
                for (int j = 1; j <= jogadores.Count; j++)
                {
                    TextBlock disponivel = new TextBlock();
                    disponivel.Text = "---";
                    disponivel.Height = 23;
                    disponivel.HorizontalAlignment = HorizontalAlignment.Center;
                    disponivel.VerticalAlignment = VerticalAlignment.Center;
                    disponivel.Margin = new Thickness(10, 6, 10, 0);
                    Grid.SetColumn(disponivel, j);
                    Grid.SetRow(disponivel, i);
                    grid1.Children.Add(disponivel);
                }
            }

            JogadorAtual.Text = jogadordavez;
            tentativas.Text = tentativa;

            if (jogadordavez == conexao.NomeJogador)
            {
                button1.IsEnabled = true;
            }

            threadRunningPartida = true;
            threadPartida = new Thread(new ThreadStart(RunClient));
            threadPartida.IsBackground = true;
            threadPartida.Start();
        }

        public void RunClient()
        {
            try
            {
                String message = "";
                String resposta = "";
                do
                {
                    try
                    {
                        message = conexao.ReceiveRetorno();

                        if (message == "atualizarpartida")
                        {
                            jogadores.Clear();
                            conexao.Send("jogadoresdapartida/" + sala);
                            resposta = conexao.Receive();
                            String[] tokens1 = resposta.Split('|');

                            for (int i = 2; i < tokens1.Count(); i++)
                            {
                                jogadores.Add(tokens1[i]);
                            }

                            conexao.Send("verificafim/" + sala);
                            resposta = conexao.Receive();

                            if (resposta == "true")
                            {
                                abreResultado();
                                threadRunningPartida = false;
                                ResultadoAberto = "abrirresultado";
                            }

                            conexao.Send("prepararatualizar/" + sala);
                            resposta = conexao.Receive();
                            string[] tokens = resposta.Split('|');
                            jogadordavez = tokens[0];
                            jogador = tokens[1];
                            tentativa = tokens[2];

                            if (tentativa == "1")
                            {
                                tentativa = "3";
                            }
                            else if (tentativa == "3")
                            {
                                tentativa = "1";
                            }
                            else if (tentativa == "4")
                            {
                                tentativa = "0";
                            }

                            /*conexao.Send("verificamudou/" + sala);
                            resposta = conexao.Receive();

                            if (resposta == "ok")
                            {
                                conexao.Send("atualizamudou/" + sala);
                                resposta = conexao.Receive();
                                string[] tokens1 = resposta.Split('|');

                                Dispatcher.BeginInvoke(
                                    new ThreadStart(() =>
                                    {
                                        labelText.Content = "Jogador " + tokens1[0] + " fez " + tokens1[1] + " pontos em " + tokens1[2];
                                    }));
                            }*/
                            if (ResultadoAberto != "abrirresultado") tratarEvento();
                        }
                        else if (message == "abandonarpartida")
                        {
                            jogadores.Clear();
                            conexao.Send("jogadoresdapartida/" + sala);
                            resposta = conexao.Receive();
                            String[] tokens1 = resposta.Split('|');

                            for (int i = 2; i < tokens1.Count(); i++)
                            {
                                jogadores.Add(tokens1[i]);
                            }

                            conexao.Send("verificafim/" + sala);
                            resposta = conexao.Receive();

                            if (resposta == "true")
                            {
                                abreResultado();
                                threadRunningPartida = false;
                                ResultadoAberto = "abrirresultado";
                            }

                            conexao.Send("prepararatualizar/" + sala);
                            resposta = conexao.Receive();
                            string[] tokens = resposta.Split('|');
                            jogadordavez = tokens[0];
                            jogador = tokens[1];
                            tentativa = tokens[2];

                            if (tentativa == "1")
                            {
                                tentativa = "3";
                            }
                            else if (tentativa == "3")
                            {
                                tentativa = "1";
                            }
                            else if (tentativa == "4")
                            {
                                tentativa = "0";
                            }

                            conexao.Send("jogadorvazando/" + sala);
                            resposta = conexao.Receive();
                            JogadorVazando = resposta;

                            if (jogador == resposta)
                            {
                                conexao.Send("sairpartida/" + sala);
                                String sair = conexao.Receive();
                                threadRunningPartida = false;
                            }
                            else
                            {
                                conexao.Send("pegarmsg/" + sala);
                                resposta = conexao.Receive();

                                Dispatcher.BeginInvoke(
                                        new ThreadStart(() =>
                                        {
                                            if (MsgChatEnviada == "") textBox1.Text = MsgChatEnviada + "*Jogador " + JogadorVazando + " fugiu da partida.*\n\n";
                                            else textBox1.Text = MsgChatEnviada + "\n*Jogador " + resposta + " fugiu da partida.*\n\n";
                                            textBox1.ScrollToEnd();
                                        }));
                            }

                            if (ResultadoAberto != "abrirresultado" && jogador != resposta) tratarEvento();
                        }
                        else if (message == "chatpartida")
                        {
                            conexao.Send("pegarmsgjogador/" + sala);
                            resposta = conexao.Receive();
                            JogadorEnviouMsg = resposta;

                            conexao.Send("pegarmsg/" + sala);
                            resposta = conexao.Receive();
                            if (MsgChatEnviada == "") MsgChatEnviada += JogadorEnviouMsg + ":\n" + resposta + "\n";
                            else MsgChatEnviada += "\n" + JogadorEnviouMsg + ":\n" + resposta + "\n";

                            Dispatcher.BeginInvoke(
                                        new ThreadStart(() =>
                                        {
                                            textBox1.Text = MsgChatEnviada;
                                            textBox1.ScrollToEnd();
                                        }));

                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Erro ao negociar com servidor: " + ex.Message,
                            "Erro (RunClient da partida)");
                        threadRunningPartida = false;
                    }
                } while (threadRunningPartida);
                Dispatcher.BeginInvoke(
                            new ThreadStart(() =>
                            {
                                Close();
                            }));
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro");
            }
        }

        void tratarEvento()
        {
            //MessageBox.Show("QTD JOGADORES: " + jogadores.Count);
            if (Dispatcher.CheckAccess())
            {
                PreencheBox();
            }
            else
            {
                Dispatcher.BeginInvoke(
                    new ThreadStart(() =>
                    {
                        PreencheBox();
                    }));
            }
        }

        public void PreencheRetangulos()
        {
            for (int i = 0; i <= nomesPts.Count; i++)
            {
                for (int j = 0; j <= jogadores.Count; j++)
                {
                    Rectangle r1 = new Rectangle();
                    r1.Stroke = Brushes.Black;
                    r1.Fill = Brushes.AliceBlue;
                    Grid.SetColumn(r1, j);
                    Grid.SetRow(r1, i);
                    grid1.Children.Add(r1);
                }
            }
        }

        public void PreencheJogadores()
        {
            for (int i = 1; i <= jogadores.Count; i++)
            {
                TextBlock jog = new TextBlock();
                jog.Text = jogadores[i - 1];
                jog.Height = 23;
                jog.HorizontalAlignment = HorizontalAlignment.Center;
                jog.VerticalAlignment = VerticalAlignment.Center;
                jog.Margin = new Thickness(10, 6, 10, 0);
                Grid.SetColumn(jog, i);
                grid1.Children.Add(jog);
            }
        }

        public void PreencheNomesPts()
        {
            for (int i = 1; i <= nomesPts.Count; i++)
            {
                TextBlock marc = new TextBlock();
                marc.Text = nomesPts[i - 1];
                marc.Height = 23;
                marc.HorizontalAlignment = HorizontalAlignment.Center;
                marc.VerticalAlignment = VerticalAlignment.Center;
                marc.Margin = new Thickness(10, 6, 10, 0);
                Grid.SetRow(marc, i);
                grid1.Children.Add(marc);
            }
        }

        public void ChecksEnable()
        {
            checkBox1.IsEnabled = true;
            checkBox2.IsEnabled = true;
            checkBox3.IsEnabled = true;
            checkBox4.IsEnabled = true;
            checkBox5.IsEnabled = true;
        }

        public void ChecksDisable()
        {
            checkBox1.IsEnabled = false;
            checkBox2.IsEnabled = false;
            checkBox3.IsEnabled = false;
            checkBox4.IsEnabled = false;
            checkBox5.IsEnabled = false;
        }

        public void ChecksFalse()
        {
            checkBox1.IsChecked = false;
            checkBox2.IsChecked = false;
            checkBox3.IsChecked = false;
            checkBox4.IsChecked = false;
            checkBox5.IsChecked = false;
        }

        public void ChecksTrue()
        {
            checkBox1.IsChecked = true;
            checkBox2.IsChecked = true;
            checkBox3.IsChecked = true;
            checkBox4.IsChecked = true;
            checkBox5.IsChecked = true;
        }

        public void ButtonsEnable()
        {
            button1.IsEnabled = true;
            buttonUm.IsEnabled = true;
            buttonDois.IsEnabled = true;
            buttonTres.IsEnabled = true;
            buttonQuatro.IsEnabled = true;
            buttonCinco.IsEnabled = true;
            buttonSeis.IsEnabled = true;
            buttonFH.IsEnabled = true;
            buttonQuadra.IsEnabled = true;
            buttonSequencia.IsEnabled = true;
            buttonGeneral.IsEnabled = true;
        }

        public void ButtonsDisable()
        {
            button1.IsEnabled = false;
            buttonUm.IsEnabled = false;
            buttonDois.IsEnabled = false;
            buttonTres.IsEnabled = false;
            buttonQuatro.IsEnabled = false;
            buttonCinco.IsEnabled = false;
            buttonSeis.IsEnabled = false;
            buttonFH.IsEnabled = false;
            buttonQuadra.IsEnabled = false;
            buttonSequencia.IsEnabled = false;
            buttonGeneral.IsEnabled = false;
        }

        public void PreenchePontos(string[] tokens)
        {
            Button[] botoes = { buttonUm, buttonDois, buttonTres, buttonQuatro, buttonCinco, buttonSeis, buttonFH, buttonQuadra, buttonSequencia, buttonGeneral };
            int contadortokens = 0;
            grid1.Children.Clear();
            PreencheRetangulos();
            PreencheJogadores();
            PreencheNomesPts();

            for (int i = 0; i < botoes.Length; i++)
            {
                String pontinho = tokens[contadortokens];

                for (int j = 0; j < jogadores.Count; j++)
                {
                    String[] tokens1 = pontinho.Split('|');
                    if (jogadordavez == jogadores[j])
                    {
                        if (tokens1[j] != "---")
                        {
                            botoes[contadortokens].IsEnabled = false;
                        }
                        contadortokens++;
                    }
                }
            }

            for (int i = 1; i <= nomesPts.Count; i++)
            {
                String pontinho = tokens[i - 1];

                for (int j = 1; j <= jogadores.Count; j++)
                {
                    String[] tokens1 = pontinho.Split('|');
                    TextBlock ponto = new TextBlock();
                    ponto.Text = tokens1[j - 1];
                    ponto.Height = 23;
                    ponto.HorizontalAlignment = HorizontalAlignment.Center;
                    ponto.VerticalAlignment = VerticalAlignment.Center;
                    ponto.Margin = new Thickness(10, 6, 10, 0);
                    Grid.SetColumn(ponto, j);
                    Grid.SetRow(ponto, i);
                    grid1.Children.Add(ponto);
                }
            }
        }

        void PreencheBox()
        {
            CheckBox[] checks = { checkBox1, checkBox2, checkBox3, checkBox4, checkBox5 };
            JogadorAtual.Text = jogadordavez;
            checkeds = "";

            for (int i = 0; i < 5; i++)
            {
                if (checks[i].IsChecked == true)
                {
                    checkeds += i.ToString() + "|";
                }
            }

            if (checkeds == "")
            {
                checkeds = "a";
            }

            ChecksDisable();
            ButtonsDisable();

            if (jogadordavez == conexao.NomeJogador)
            {
                ButtonsEnable();
            }

            if (tentativa == "3" && jogadordavez == conexao.NomeJogador)
            {
                ChecksTrue();
            }
            else if (tentativa != "3" && jogadordavez == conexao.NomeJogador)
            {
                ChecksEnable();
            }


            conexao.Send("dadosatualizar/" + sala);
            String message = conexao.Receive();
            string[] tokens = message.Split('|');

            tentativas.Text = tentativa.ToString();
            dado1.Text = tokens[0];
            dado2.Text = tokens[1];
            dado3.Text = tokens[2];
            dado4.Text = tokens[3];
            dado5.Text = tokens[4];

            if (tentativa == "3" && checkBox1.IsChecked == true || tentativa == "3" && checkBox2.IsChecked == true || tentativa == "3" && checkBox3.IsChecked == true || tentativa == "3" && checkBox4.IsChecked == true || tentativa == "3" && checkBox5.IsChecked == true)
            {
                dado1.Text = null;
                dado2.Text = null;
                dado3.Text = null;
                dado4.Text = null;
                dado5.Text = null;
                ChecksTrue();
            }

            conexao.Send("pontosatualizar/" + sala);
            String resposta = conexao.Receive();
            string[] tokens1 = resposta.Split('{');
            Button[] botoes = { buttonUm, buttonDois, buttonTres, buttonQuatro, buttonCinco, buttonSeis, buttonFH, buttonQuadra, buttonSequencia, buttonGeneral };

            /*String puropontos = "";
            for (int i = 0; i < tokens1.Length; i++)
            {
                puropontos += tokens1[i] + "|";
            }
            puropontos = puropontos.Remove(puropontos.Length - 1);*/

            for (int i = 0; i < tokens1.Length; i++)
            {
                String marcacao = tokens1[i];
                string[] tokens2 = marcacao.Split('|');
                marcacao = "";
                for (int j = 0; j < tokens2.Length; j++)
                {
                    if (tokens2[j] == "-1") marcacao += "---|";
                    else marcacao += tokens2[j] + "|";
                }
                marcacao = marcacao.Remove(marcacao.Length - 1);
                tokens1[i] = marcacao;
            }

            PreenchePontos(tokens1);
        }

        void abreResultado()
        {
            Dispatcher.BeginInvoke(
                    new ThreadStart(() =>
                    {
                        threadRunningPartida = false;

                        Resultado r = new Resultado(conexao, dono, sala);
                        r.ShowDialog();
                    }));
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            CheckBox[] checks = { checkBox1, checkBox2, checkBox3, checkBox4, checkBox5 };
            checkeds = "";

            for (int i = 0; i < 5; i++)
            {
                if (checks[i].IsChecked == true)
                {
                    checkeds += i.ToString() + "/";
                }
            }

            if (checkeds == "")
            {
                checkeds = "a";
            }

            if (tentativa != "0")
            {
                /*if (tentativa == "3" && checkBox1.IsChecked == true || tentativa == "3" && checkBox2.IsChecked == true || tentativa == "3" && checkBox3.IsChecked == true || tentativa == "3" && checkBox4.IsChecked == true || tentativa == "3" && checkBox5.IsChecked == true)
                {
                    MessageBox.Show("Você precisa rodar todos os dados na primeira jogada!");
                }
                else if (checkBox1.IsChecked == true && checkBox2.IsChecked == true && checkBox3.IsChecked == true && checkBox4.IsChecked == true && checkBox5.IsChecked == true)
                {
                    MessageBox.Show("Você deve rodar pelo menos um dado!");
                    //lstJog[jogcont].tentativas++;
                }
                else
                {*/
                    conexao.Send("rolardados/" + sala + "/" + checkeds.Remove(checkeds.Length - 1));
                    String message = conexao.Receive();
                //}
            }

            else
            {
                MessageBox.Show("Você deve marcar sua pontuação!");
            }
        }

        private void um(object sender, RoutedEventArgs e)
        {
            if (tentativa == "3")
            {
                MessageBox.Show("Só é possível marcar após a primeira jogada!");
            }
            else
            {
                conexao.Send("marcaum/" + sala);
                String message = conexao.Receive();
            }
        }

        private void dois(object sender, RoutedEventArgs e)
        {
            if (tentativa == "3")
            {
                MessageBox.Show("Só é possível marcar após a primeira jogada!");
            }
            else
            {
                conexao.Send("marcadois/" + sala);
                String message = conexao.Receive();
            }
        }

        private void tres(object sender, RoutedEventArgs e)
        {
            if (tentativa == "3")
            {
                MessageBox.Show("Só é possível marcar após a primeira jogada!");
            }
            else
            {
                conexao.Send("marcatres/" + sala);
                String message = conexao.Receive();
            }
        }

        private void quatro(object sender, RoutedEventArgs e)
        {
            if (tentativa == "3")
            {
                MessageBox.Show("Só é possível marcar após a primeira jogada!");
            }
            else
            {
                conexao.Send("marcaquatro/" + sala);
                String message = conexao.Receive();
            }
        }

        private void cinco(object sender, RoutedEventArgs e)
        {
            if (tentativa == "3")
            {
                MessageBox.Show("Só é possível marcar após a primeira jogada!");
            }
            else
            {
                conexao.Send("marcacinco/" + sala);
                String message = conexao.Receive();
            }
        }

        private void seis(object sender, RoutedEventArgs e)
        {
            if (tentativa == "3")
            {
                MessageBox.Show("Só é possível marcar após a primeira jogada!");
            }
            else
            {
                conexao.Send("marcaseis/" + sala);
                String message = conexao.Receive();
            }
        }

        private void FH(object sender, RoutedEventArgs e)
        {
            if (tentativa == "3")
            {
                MessageBox.Show("Só é possível marcar após a primeira jogada!");
            }
            else
            {
                conexao.Send("marcafh/" + sala);
                String message = conexao.Receive();
            }
        }

        private void Quadra(object sender, RoutedEventArgs e)
        {
            if (tentativa == "3")
            {
                MessageBox.Show("Só é possível marcar após a primeira jogada!");
            }
            else
            {
                conexao.Send("marcaquadra/" + sala);
                String message = conexao.Receive();
            }
        }

        private void Sequencia(object sender, RoutedEventArgs e)
        {
            if (tentativa == "3")
            {
                MessageBox.Show("Só é possível marcar após a primeira jogada!");
            }
            else
            {
                conexao.Send("marcasequencia/" + sala);
                String message = conexao.Receive();
            }
        }

        private void General(object sender, RoutedEventArgs e)
        {
            if (tentativa == "3")
            {
                MessageBox.Show("Só é possível marcar após a primeira jogada!");
            }
            else
            {
                conexao.Send("marcageneral/" + sala);
                String message = conexao.Receive();
            }
        }

        private void button12_Click(object sender, RoutedEventArgs e)
        {
            if (MessageBox.Show("Tem certeza?", "Ei, doido, saia não!", MessageBoxButton.YesNo) == MessageBoxResult.No)
            {

            }
            else
            {
                conexao.Send("abandonarpartida/" + sala);
                String message = conexao.Receive();
            }
        }

        private void button2_Click(object sender, RoutedEventArgs e)
        {
            conexao.Send("chatmsg/" + sala + "/" + textBox2.Text);
            String message = conexao.Receive();
            textBox2.Text = String.Empty;
        }

        private void textBox2_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                conexao.Send("chatmsg/" + sala + "/" + textBox2.Text);
                String message = conexao.Receive();
                textBox2.Text = String.Empty;
            }
        }


    }
}
